package com.wbz.behavioral.strategy;

import com.wbz.behavioral.strategy.context.StrategyOrderContext;
import com.wbz.behavioral.strategy.strategy.impl.FixedAmountDiscountStrategy;
import com.wbz.behavioral.strategy.strategy.impl.NoDiscountStrategy;
import com.wbz.behavioral.strategy.strategy.impl.PercentageDiscountStrategy;

import java.util.Scanner;

/**
 * Java策略模式样例
 */
public class StrategyMain {
    /**
     * 初始化上下文：客户端代码创建一个OrderContext对象，并传入一个初始的策略对象（例如NoDiscountStrategy）。
     * 用户输入：程序通过控制台或其他方式接收用户的输入，选择不同的折扣策略。
     * 更换策略：根据用户的输入，客户端代码调用context.setStrategy方法来更换当前使用的策略对象。
     * 应用策略：调用context.calculateFinalPrice方法来计算最终价格，该方法会使用当前设置的策略对象来应用折扣。
     * 重复：用户可以多次输入不同的价格和策略，每次输入后都会根据当前的策略计算最终价格。
     *
     * @param args 命令行参数
     */
    public static void main(String[] args) {
        // 创建上下文对象，初始策略为无折扣
        StrategyOrderContext context = new StrategyOrderContext(new NoDiscountStrategy());

        Scanner scanner = new Scanner(System.in);

        while (true) {
            System.out.println("请输入商品原价:");
            double originalPrice = scanner.nextDouble();

            System.out.println("请选择折扣策略: 1. 无折扣 2. 固定金额折扣 3. 百分比折扣 0. 退出");
            int choice = scanner.nextInt();

            if (choice == 0) {
                break;
            }

            switch (choice) {
                case 1:
                    context.setStrategy(new NoDiscountStrategy());
                    break;
                case 2:
                    System.out.println("请输入固定金额折扣:");
                    double discountAmount = scanner.nextDouble();
                    context.setStrategy(new FixedAmountDiscountStrategy(discountAmount));
                    break;
                case 3:
                    System.out.println("请输入百分比折扣:");
                    double discountPercentage = scanner.nextDouble();
                    context.setStrategy(new PercentageDiscountStrategy(discountPercentage));
                    break;
                default:
                    System.out.println("无效的选择");
                    continue;
            }

            double finalPrice = context.calculateFinalPrice(originalPrice);
            System.out.println("最终价格: " + finalPrice);
        }

        scanner.close();
    }
}
